﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD.Core {

    /// <summary>
    /// バウンディング スフィアをあらわす構造体
    /// </summary>
    /// <remarks>
    /// <see cref="BouindgBox"/> オブジェクトはバウンディング ボリュームの1種で、
    /// ノードを囲う半径 r の球です。
    /// バウンディング ボリュームの詳細については、<see cref="BoundingVolume"/> クラスの解説を参照してください。
    /// シーンをフリーズすると個々のノードのバウンディング ボリュームからバウンディング ボリューム階層が形成されます。
    /// バウンディング ボリューム階層の詳細については <see cref="World"/> クラスの解説を参照してください。
    /// ユーザーが <see cref="BoundingSphere"/> 型を構造体をインスタンス化することはできず、
    /// 必ずエンジン側が作成したものを戻り値で受け取ります。
    /// アニメート可能、エクスポート可能。
    /// </remarks> 
    public struct BoundingSphere : IAnimatable<float>, IExportable<float> {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="radius">半径</param>
        /// <param name="x">原点のX座標</param>
        /// <param name="y">原点のY座標</param>
        /// <param name="z">原点のZ座標</param>
        public BoundingSphere (float radius, float x, float y, float z)
            : this () {
            this.X = x;
            this.Y = y;
            this.Z = z;
            this.Radius = radius;
        }

        /// <summary>
        /// 有効無効フラグ
        /// </summary>
        /// <remarks>
        /// このバウンディングスフィアが有効なとき <c>true</c> を返し、そうでない時は <c>false</c> を返します。
        /// <note type="implement">
        /// 現在必ず <c>true</c> を返します。どういう用途で定義したのか忘れました。
        /// </note>
        /// </remarks>
        public bool IsValid {
            get { return true; }
        }

        /// <summary>
        /// 半径
        /// </summary>
        /// <remarks>
        /// バウンディング スフィアを構成する球の半径です。
        /// </remarks>
        /// <value>半径</value>
        public float Radius { get; private set; }

        /// <summary>
        /// 中心のX座標
        /// </summary>
        /// <remarks>
        /// バウンディング スフィアの中心のX座標です。
        /// </remarks>
        public float X { get; private set; }

        /// <summary>
        /// 中心のY座標
        /// </summary>
        /// <remarks>
        /// バウンディングスフィアの中心のX座標です。
        /// </remarks>
        public float Y { get; private set; }

        /// <summary>
        /// 中心のZ座標
        /// </summary>
        /// <remarks>
        /// バウンディングスフィアの中心のX座標です。
        /// </remarks>
        public float Z { get; private set; }

        /// <inheritdoc/>
        public int ComponentCount { get { return 4; } }

        /// <inheritdoc/>
        public float this[int index] {
            get {
                if (index < 0 || index > ComponentCount - 1) {
                    throw new IndexOutOfRangeException ();
                }
                return 0;
            }
            set {
                if (index < 0 || index > ComponentCount - 1) {
                    throw new IndexOutOfRangeException ();
                }
            }
        }

        /// <inheritdoc/>
        public override string ToString () {
            return string.Format ("BoundingSphere, Radius={0}, X={1}, Y={2}, Z={3}", Radius, X, Y, Z);
        }

    }
}
